package demo.items;

import java.util.ArrayList;
import java.util.Iterator;

import webdriver.BaseEntity;

/**
 * Класс, описывающий сущность - игру с ее основными характеристиками
 */
public class Game extends BaseEntity implements Comparable<Game>{

	private String name;									// название
	private String discountPercent;							// скидка в %
	private Double discountDouble;							// скидка абсолютная (в USD)
	private String originalPrice;							// начальная цена
	private String finalPrice;								// цена со скидкой (конечная)
	private String gameUrl;									// урл игры

	public static String descriptionLtr = "//div[contains(@class,'tab_desc with_discount')]";
	public static String nameLtr = descriptionLtr+"//h4";
	public static String priceAndDiscountBlockLtr = "//div[@class='tab_price']";
	public static String discountPctLtr = priceAndDiscountBlockLtr+"//div[@class='discount_pct']";
	public static String originalPriceLtr = priceAndDiscountBlockLtr+"//div[@class='discount_original_price']";
	public static String finalPriceLtr = priceAndDiscountBlockLtr+"//div[@class='discount_final_price']";
	public static String gameUrlLtr = "/a[@class='tab_overlay']";

	/**
	 * Конструктор для инициализации объекта игры
	 * @param iName название
	 * @param discPct скидка в %
	 * @param discountDouble скидка в валюте
	 * @param origPrice начальная цена
	 * @param finPrice конечная цена
	 * @param gameUrl урл
	 */
	public Game(String iName, String discPct, Double discountDouble, String origPrice, String finPrice, String gameUrl){
		if (discountDouble == null ){
            throw new NullPointerException();
		}
		this.name = iName;
		this.discountPercent = discPct;
		this.discountDouble = discountDouble;
		this.originalPrice = origPrice;
		this.finalPrice = finPrice;
		this.gameUrl = gameUrl;
	}

	/**
	 * Следующие 3 метода переопределены для сравнения игр между собой по размеру скидки
	 * Это позволит легко выполнять сортировку всей коллекции игр
	 */

	/**
	 * @param o object
	 * @return true ifd equals
	 */
	@Override
    public boolean equals(Object o) {
        if (!(o instanceof Game)) {
			return false;
		}
        Game n = (Game) o;
        return n.getDiscountDouble().compareTo(discountDouble)==0;
    }

	@Override
	public int hashCode() {
        return getDiscountDouble().hashCode();
    }

	@Override
	public int compareTo(Game gameToCompare) {
		int lastCmp = discountDouble.compareTo(gameToCompare.getDiscountDouble());
        return (lastCmp != 0 ? lastCmp : 0);
	}

	// переопределен для удобства вывода инфы об игре
    @Override
    public String toString() {
	return name;
    }

    /**
     * Выводит инфу об одной игре на консоль
     * @param game игра
     */
	public static void printGameInfo(Game game){
		logger.info("Game name: "+game.getName() +
			 ", dicount: "+game.getDiscountPercent() +
			 ", original price: "+game.getOriginalPrice()+
			 ", final price: "+game.getFinalPrice()+
			 ", gameUrl: "+game.getGameUrl());
	}

	/**
	 * Выводит инфу обо всех играх коллекции на консоль
	 * @param gamesList коллекция игр
	 */
	public static void printAllGamesInfo(ArrayList<Game> gamesList){
		logger.info("Выводим информацию обо всех играх коллекции. Игры отсортированы по убыванию скидки >>>");
		logger.info("");
		for (Iterator<Game> iterator = gamesList.iterator(); iterator.hasNext();) {
			Game item = (Game) iterator.next();
			printGameInfo(item);
		}
	}

	/**
	 * @return the name
	 */
	public String getName() {
		return name;
	}

	/**
	 * @param name the name to set
	 */
	public void setName(String name) {
		this.name = name;
	}

	/**
	 * @return the discountPercent
	 */
	public String getDiscountPercent() {
		return discountPercent;
	}

	/**
	 * @param discountPercent the discountPercent to set
	 */
	public void setDiscountPercent(String discountPercent) {
		this.discountPercent = discountPercent;
	}

	/**
	 * @return the originalPrice
	 */
	public String getOriginalPrice() {
		return originalPrice;
	}

	/**
	 * @param originalPrice the originalPrice to set
	 */
	public void setOriginalPrice(String originalPrice) {
		this.originalPrice = originalPrice;
	}

	/**
	 * @return the finalPrice
	 */
	public String getFinalPrice() {
		return finalPrice;
	}

	/**
	 * @param finalPrice the finalPrice to set
	 */
	public void setFinalPrice(String finalPrice) {
		this.finalPrice = finalPrice;
	}

	/**
	 * @return the gameUrl
	 */
	public String getGameUrl() {
		return gameUrl;
	}

	/**
	 * @param gameUrl the gameUrl to set
	 */
	public void setGameUrl(String gameUrl) {
		this.gameUrl = gameUrl;
	}

	/**
	 * @return the discountDouble
	 */
	public Double getDiscountDouble() {
		return discountDouble;
	}

	/**
	 * @param discountDouble the discountDouble to set
	 */
	public void setDiscountDouble(Double discountDouble) {
		this.discountDouble = discountDouble;
	}

	@Override
	protected String formatLogMsg(String message) {	return null;}
}
